package main

import (
	"bufio"
	"encoding/json"
	"fmt"
	"os"
	"os/exec"
	"path/filepath"
	"runtime"
)

// AddonInfo 插件信息结构体
type AddonInfo struct {
	Author      string `json:"author"`
	Email       string `json:"email"`
	Description string `json:"description"`
}

// Addon 插件主结构体
type Addon struct {
	Namespace string    `json:"namespace"`
	Main      string    `json:"main"`
	Version   string    `json:"version"`
	Name      string    `json:"name"`
	Info      AddonInfo `json:"info"`
	Type      string    `json:"type"`      // 功能类型：功能插件、主题插件、语言插件
	Type2     string    `json:"type2"`     // 部署类型：客户端插件、服务器插件
	Resources string    `json:"resources"` // 资源目录
}

func main() {
	args := os.Args
	if len(args) < 2 {
		fmt.Println("错误: 请指定命令 (new 或 build)")
		os.Exit(1)
	}

	switch args[1] {
	case "new":
		handleNewCommand()
	case "build":
		if len(args) < 3 {
			fmt.Println("错误: 请指定要打包的目录")
			os.Exit(1)
		}
		handleBuildCommand(args[2])
	default:
		fmt.Printf("未知命令: %s\n", args[1])
		os.Exit(1)
	}
}

// 处理"new"命令，创建新插件结构
func handleNewCommand() {
	scanner := bufio.NewScanner(os.Stdin)
	var addon Addon

	addon.Namespace = readInput(scanner, "输入插件的命名空间: ")
	addon.Main = readInput(scanner, "输入插件的主文件名: ") + ".py"
	addon.Version = readInput(scanner, "输入插件的版本: ")
	addon.Name = readInput(scanner, "输入插件的名称: ")
	addon.Info.Author = readInput(scanner, "输入插件的作者: ")
	addon.Info.Email = readInput(scanner, "输入作者的邮箱: ")
	addon.Info.Description = readInput(scanner, "输入插件的描述: ")
	addon.Type = readInput(scanner, "输入插件类型 (0: 功能插件 1: 主题插件 2: 语言插件): ")
	addon.Type2 = readInput(scanner, "输入插件部署类型 (0: 客户端插件 1: 服务器插件): ")
	addon.Resources = readInput(scanner, "输入插件的资源目录: ")

	// 创建命名空间目录
	nsPath := filepath.Join(addon.Namespace)
	if err := os.MkdirAll(nsPath, 0755); err != nil {
		fmt.Printf("无法创建目录: %s, 错误: %v\n", nsPath, err)
		os.Exit(1)
	}

	// 创建子命名空间目录
	nsSubPath := filepath.Join(nsPath, addon.Namespace)
	if err := os.MkdirAll(nsSubPath, 0755); err != nil {
		fmt.Printf("无法创建目录: %s, 错误: %v\n", nsSubPath, err)
		os.Exit(1)
	}

	// 写入addons.json
	jsonFilePath := filepath.Join(nsPath, "addons.json")
	jsonData, err := json.MarshalIndent(addon, "", "    ")
	if err != nil {
		fmt.Printf("JSON序列化错误: %v\n", err)
		os.Exit(1)
	}
	if err := os.WriteFile(jsonFilePath, jsonData, 0644); err != nil {
		fmt.Printf("无法写入文件: %s, 错误: %v\n", jsonFilePath, err)
		os.Exit(1)
	}

	// 创建主Python文件
	mainFilePath := filepath.Join(nsSubPath, addon.Main+".py")
	mainContent := fmt.Sprintf(`# Created in LC DevTools
import lib


Library = lib.AddonsLibrary('%s')


def %sInit():
    pass


def %sMain():
    %sInit()
    pass`, addon.Namespace, addon.Namespace, addon.Namespace, addon.Namespace)
	if err := os.WriteFile(mainFilePath, []byte(mainContent), 0644); err != nil {
		fmt.Printf("无法写入文件: %s, 错误: %v\n", mainFilePath, err)
		os.Exit(1)
	}

	// 创建资源目录结构
	resPath := filepath.Join(nsSubPath, addon.Resources)
	if err := os.MkdirAll(resPath, 0755); err != nil {
		fmt.Printf("无法创建目录: %s, 错误: %v\n", resPath, err)
		os.Exit(1)
	}

	imagesPath := filepath.Join(resPath, "images")
	if err := os.MkdirAll(imagesPath, 0755); err != nil {
		fmt.Printf("无法创建目录: %s, 错误: %v\n", imagesPath, err)
		os.Exit(1)
	}

	soundsPath := filepath.Join(resPath, "sounds")
	if err := os.MkdirAll(soundsPath, 0755); err != nil {
		fmt.Printf("无法创建目录: %s, 错误: %v\n", soundsPath, err)
		os.Exit(1)
	}

	// 创建lib.py
	libFilePath := filepath.Join(nsSubPath, "lib.py")
	libContent := `# Created in LC DevTools

import os


class AddonsLibrary:
    def __init__(self, namespace: str):
        self.namespace = namespace

    def GetResourceDirPath(self, res):
        return f'{os.getcwd()}/addons/{self.namespace}/{self.namespace}/{res}'`
	if err := os.WriteFile(libFilePath, []byte(libContent), 0644); err != nil {
		fmt.Printf("无法写入文件: %s, 错误: %v\n", libFilePath, err)
		os.Exit(1)
	}

	fmt.Println("插件创建成功!")
}

// 处理"build"命令，打包插件，支持跨平台
func handleBuildCommand(dir string) {
	var cmd *exec.Cmd
	outputPath := fmt.Sprintf("../%s.zca", dir)
	
	// 根据不同操作系统使用不同的打包命令
	switch runtime.GOOS {
	case "windows":
		// Windows使用PowerShell命令
		zipCmd := fmt.Sprintf("Compress-Archive -Path ../%s -DestinationPath ../%s.zip -Force", dir, dir)
		renameCmd := fmt.Sprintf("Rename-Item -Path ../%s.zip -NewName %s.zca -Force", dir, dir)
		cmd = exec.Command("powershell", "-Command", zipCmd+";"+renameCmd)
	case "linux", "darwin":
		// Linux和macOS使用zip命令
		// 先删除可能存在的旧文件
		os.Remove(outputPath)
		// 使用zip命令创建压缩文件
		cmd = exec.Command("zip", "-r", outputPath, fmt.Sprintf("../%s", dir))
	default:
		fmt.Printf("不支持的操作系统: %s\n", runtime.GOOS)
		os.Exit(1)
	}

	// 执行打包命令并捕获输出
	output, err := cmd.CombinedOutput()
	if err != nil {
		fmt.Printf("打包失败: %v\n输出: %s\n", err, string(output))
		os.Exit(1)
	}

	fmt.Printf("打包成功: %s\n", outputPath)
}

// 读取用户输入
func readInput(scanner *bufio.Scanner, prompt string) string {
	fmt.Print(prompt)
	scanner.Scan()
	return scanner.Text()
}
